package Test;

import org.junit.Assert;
import org.junit.Test;

import Planificador.*;

public class testAlgoritmo {
	Proceso p1, p2, p3, p4;

	@Test
	public void testFifo() {
		p1 = new Proceso("p1");
		p2 = new Proceso("p2");
		p3 = new Proceso("p3");
		p4 = new Proceso("p4");

		Cola colaFIFO = new Cola(new AlgoritmoFIFO());

		colaFIFO.addProceso(p1).addProceso(p2).addProceso(p3).addProceso(p4);

		Assert.assertEquals(p1, colaFIFO.siguienteProceso());
		Assert.assertEquals(p2, colaFIFO.siguienteProceso());
		Assert.assertEquals(p3, colaFIFO.siguienteProceso());
		Assert.assertEquals(p4, colaFIFO.siguienteProceso());
		Assert.assertEquals(null, colaFIFO.siguienteProceso());
	}

	@Test
	public void testSPN() throws ProcesoException {
		p1 = new Proceso("p1");
		p2 = new Proceso("p2");
		p3 = new Proceso("p3");
		p4 = new Proceso("p4");

		Procesador p = new Procesador();

		Cola colaSPN = new Cola(new AlgoritmoSPNsinDesalojo());

		p1.addInstruccion(new InstruccionUsoCpu(5, p));
		p2.addInstruccion(new InstruccionUsoCpu(2, p));
		p3.addInstruccion(new InstruccionUsoCpu(6, p));
		p4.addInstruccion(new InstruccionUsoCpu(1, p));
		colaSPN.addProceso(p1).addProceso(p2).addProceso(p3).addProceso(p4);

		p1.inicializar();
		p2.inicializar();
		p3.inicializar();
		p4.inicializar();
				
		Assert.assertEquals(p4, colaSPN.siguienteProceso());
		Assert.assertEquals(p2, colaSPN.siguienteProceso());
		Assert.assertEquals(p1, colaSPN.siguienteProceso());
		Assert.assertEquals(p3, colaSPN.siguienteProceso());

	}

	@Test
	public void testPrioridadesSinDesalojo() {
		p1 = new Proceso("p1");
		p2 = new Proceso("p2");
		p3 = new Proceso("p3");
		p4 = new Proceso("p4");

		Cola colaPrioridades = new Cola(new AlgoritmoPrioridadesSinDesalojo());

		p1.setPrioridad(4);
		p2.setPrioridad(1);
		p3.setPrioridad(3);
		p4.setPrioridad(5);

		colaPrioridades.addProceso(p1).addProceso(p2).addProceso(p3)
				.addProceso(p4);

		Assert.assertEquals(p2, colaPrioridades.siguienteProceso());
		Assert.assertEquals(p3, colaPrioridades.siguienteProceso());
		Assert.assertEquals(p1, colaPrioridades.siguienteProceso());
		Assert.assertEquals(p4, colaPrioridades.siguienteProceso());

	}

}
